/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.perutaxi.datos;

import com.perutaxi.entidades.eRol;
import com.perutaxi.entidades.eUsuario;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author PeruTaxi
 */
public class dUsuario implements Serializable {

    public static eUsuario inicializar() {
        eUsuario usuario = new eUsuario();
        usuario.setUsuario("");
        usuario.setClave("");
        usuario.setRol(new eRol());
        usuario.setEstado(Boolean.TRUE);

        return usuario;
    }

    public static eUsuario obtenerPorId(Long id) throws Exception {
        eUsuario usuario = new eUsuario();
        Connection cnx = Conexion.getConexion();
        String query = "SELECT * FROM USUARIO WHERE ID = " + id;
        try {
            PreparedStatement ps = cnx.prepareCall(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                usuario.setId(rs.getLong(1));
                usuario.setUsuario(rs.getString(2));
                usuario.setClave(rs.getString(3));
                usuario.setRol(dRol.obtenerPorId(rs.getLong(4)));
                usuario.setEstado(rs.getBoolean(5));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cnx.close();
        }

        return usuario;
    }

    public static List<eUsuario> obtenerUsuario(eUsuario usuario) throws Exception {
        List<eUsuario> lista = new ArrayList<eUsuario>();
        Connection cnx = Conexion.getConexion();
        String query = "SELECT * FROM USUARIO WHERE ID = ID";
        if (usuario.getId() != null && !usuario.getId().equals(0L)) {
            query += " AND ID = " + usuario.getId();
        } else {
            if (usuario.getUsuario() != null && usuario.getUsuario().length() > 0) {
                query += " AND USUARIO LIKE '" + usuario.getUsuario().toUpperCase() + "'";
            }
            if (usuario.getRol() != null && usuario.getRol().getId() != null && !usuario.getRol().getId().equals(0L)) {
                query += " AND ROL = " + usuario.getRol().getId();
            }
            if (usuario.getEstado() != null) {
                if (usuario.getEstado()) {
                    query += " AND ESTADO = " + 1;
                } else {
                    query += " AND ESTADO = " + 0;
                }
            }
        }
        query += " ORDER BY ID DESC";
        try {
            PreparedStatement ps = cnx.prepareCall(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                eUsuario ent = new eUsuario();
                ent.setId(rs.getLong(1));
                ent.setUsuario(rs.getString(2));
                ent.setClave(rs.getString(3));
                ent.setRol(dRol.obtenerPorId(rs.getLong(4)));
                ent.setEstado(rs.getBoolean(5));
                lista.add(ent);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cnx.close();
        }

        return lista;
    }

    public static eUsuario login(String usr, String pwd) throws Exception {
        eUsuario usuario = new eUsuario();
        Connection cnx = Conexion.getConexion();
        String query = "SELECT * FROM USUARIO WHERE USUARIO = '" + usr.toUpperCase() + "'";
        query += " AND CLAVE = '" + pwd.toUpperCase() + "'";
        try {
            PreparedStatement ps = cnx.prepareCall(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                usuario.setId(rs.getLong(1));
                usuario.setUsuario(rs.getString(2));
                usuario.setClave(rs.getString(3));
                usuario.setRol(dRol.obtenerPorId(rs.getLong(4)));
                usuario.setEstado(rs.getBoolean(5));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cnx.close();
        }

        return usuario;
    }

    public static boolean guardar(eUsuario usuario) throws Exception {
        boolean retorno = true;
        Connection cnx = Conexion.getConexion();
        String query = "INSERT INTO USUARIO VALUES (?,?,?,?,?)";
        try {
            PreparedStatement ps = cnx.prepareStatement(query);
            ps.setLong(1, usuario.getId());
            ps.setString(2, usuario.getUsuario().toUpperCase());
            ps.setString(3, usuario.getClave().toUpperCase());
            ps.setLong(4, usuario.getIdRol());
            ps.setBoolean(5, usuario.getEstado());
            ps.execute();
        } catch (Exception e) {
            e.printStackTrace();
            retorno = false;
        } finally {
            cnx.close();
        }

        return retorno;
    }

    public static List<eUsuario> obtenerTodos() throws Exception {
        List<eUsuario> lista = new ArrayList<eUsuario>();
        Connection cnx = Conexion.getConexion();
        String query = "SELECT * FROM USUARIO";
        try {
            PreparedStatement ps = cnx.prepareCall(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                eUsuario usuario = new eUsuario();
                usuario.setId(rs.getLong(1));
                usuario.setUsuario(rs.getString(2));
                usuario.setClave(rs.getString(3));
                usuario.setRol(dRol.obtenerPorId(rs.getLong(4)));
                usuario.setEstado(rs.getBoolean(5));
                lista.add(usuario);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cnx.close();
        }

        return lista;
    }

    public static boolean actualizar(eUsuario usuario) throws Exception {
        Connection cnx = Conexion.getConexion();
        String query = "UPDATE USUARIO SET USUARIO = ?, CLAVE = ?, ROL = ?, ESTADO = ? WHERE ID = ?";
        boolean retorno = true;
        try {
            PreparedStatement ps = cnx.prepareStatement(query);
            ps.setString(1, usuario.getUsuario().toUpperCase());
            ps.setString(2, usuario.getClave().toUpperCase());
            ps.setLong(3, usuario.getRol().getId());
            ps.setBoolean(4, usuario.getEstado());
            ps.setLong(5, usuario.getId());
            ps.execute();
        } catch (Exception e) {
            e.printStackTrace();
            retorno = false;
        } finally {
            cnx.close();
        }

        return retorno;
    }
}
